home *** CD-ROM | disk | FTP | other *** search
- /* xlio - xlisp i/o routines */
-
- #include "xlisp.h"
-
- /* external variables */
- extern int xlplevel;
- extern int xlfsize;
- extern NODE *xlstack;
- extern NODE *s_stdin;
- extern int xldebug;
- extern int prompt;
-
- /* xlgetc - get a character from a file or stream */
- int xlgetc(fptr)
- NODE *fptr;
- {
- NODE *lptr,*cptr;
- FILE *fp;
- int ch;
-
- /* check for input from nil */
- if (fptr == NULL)
- ch = EOF;
-
- /* otherwise, check for input from a stream */
- else if (consp(fptr)) {
- if ((lptr = car(fptr)) == NULL)
- ch = EOF;
- else {
- if (!consp(lptr) ||
- (cptr = car(lptr)) == NULL || !fixp(cptr))
- xlfail("bad stream");
- if (rplaca(fptr,cdr(lptr)) == NULL)
- rplacd(fptr,NULL);
- ch = cptr->n_int;
- }
- }
-
- /* otherwise, check for a buffered file character */
- else if (ch = fptr->n_savech)
- fptr->n_savech = 0;
-
- /* otherwise, get a new character */
- else {
-
- /* get the file pointer */
- fp = fptr->n_fp;
-
- /* prompt if necessary */
- if (prompt && fp == stdin) {
-
- /* print the debug level */
- if (xldebug)
- printf("%d:",xldebug);
-
- /* print the nesting level */
- if (xlplevel > 0)
- printf("%d",xlplevel);
-
- /* print the prompt */
- printf("> ");
- prompt = FALSE;
- }
-
- /* get the character */
- if (((ch = getc(fp)) == '\n' || ch == EOF) && fp == stdin)
- prompt = TRUE;
-
- /* check for input abort */
- if (fp == stdin && ch == '\007') {
- putchar('\n');
- xlabort("input aborted");
- }
- }
-
- /* return the character */
- return (ch);
- }
-
- /* xlpeek - peek at a character from a file or stream */
- int xlpeek(fptr)
- NODE *fptr;
- {
- NODE *lptr,*cptr;
- int ch;
-
- /* check for input from nil */
- if (fptr == NULL)
- ch = EOF;
-
- /* otherwise, check for input from a stream */
- else if (consp(fptr)) {
- if ((lptr = car(fptr)) == NULL)
- ch = EOF;
- else {
- if (!consp(lptr) ||
- (cptr = car(lptr)) == NULL || !fixp(cptr))
- xlfail("bad stream");
- ch = cptr->n_int;
- }
- }
-
- /* otherwise, get the next file character and save it */
- else
- ch = fptr->n_savech = xlgetc(fptr);
-
- /* return the character */
- return (ch);
- }
-
- /* xlputc - put a character to a file or stream */
- xlputc(fptr,ch)
- NODE *fptr; int ch;
- {
- NODE *oldstk,lptr;
-
- /* count the character */
- xlfsize++;
-
- /* check for output to nil */
- if (fptr == NULL)
- ;
-
- /* otherwise, check for output to a stream */
- else if (consp(fptr)) {
- oldstk = xlsave(&lptr,NULL);
- lptr.n_ptr = newnode(LIST);
- rplaca(lptr.n_ptr,newnode(INT));
- car(lptr.n_ptr)->n_int = ch;
- if (cdr(fptr))
- rplacd(cdr(fptr),lptr.n_ptr);
- else
- rplaca(fptr,lptr.n_ptr);
- rplacd(fptr,lptr.n_ptr);
- xlstack = oldstk;
- }
-
- /* otherwise, output the character to a file */
- else
- putc(ch,fptr->n_fp);
- }
-
- /* xlflush - flush the input buffer */
- int xlflush()
- {
- if (!prompt)
- while (xlgetc(s_stdin->n_symvalue) != '\n')
- ;
- }